Skip to main content

Adding Express Middlewares

Catalyst uses Express.js under the hood, allowing you to add custom middlewares in server/server.js.

The examples below use the ESM server contract in Catalyst 0.3.x. Legacy 0.2.x applications may retain CommonJS imports until they upgrade.

Basic Setup

Export an addMiddlewares function that receives the Express app instance:

server/server.js
import express from "express";
import path from "path";
import expressStaticGzip from "express-static-gzip";

export function addMiddlewares(app) {
if (process.env.NODE_ENV === "production") {
app.use(
`${process.env.PUBLIC_STATIC_ASSET_PATH}/client`,
expressStaticGzip(
path.join(__dirname, `../${process.env.BUILD_OUTPUT_PATH}/client`),
{
enableBrotli: true,
orderPreference: ["br", "gz"],
serveStatic: { maxAge: "1y", etag: true },
}
)
);
}

app.use("/favicon.ico", express.static(path.join(__dirname, "../public/favicon.ico")));
}

Examples

Serving Static Files

server/server.js
import express from "express";
import path from "path";

export function addMiddlewares(app) {
app.use("/assets", express.static(path.join(__dirname, "../src/static")));
app.use("/favicon.ico", express.static(path.join(__dirname, "../public/favicon.ico")));
}

Adding Custom Headers

server/server.js
export function addMiddlewares(app) {
app.use((req, res, next) => {
res.setHeader("X-Custom-Header", "value");
next();
});
}

Request Logging

server/server.js
import morgan from "morgan";

export function addMiddlewares(app) {
app.use(morgan("combined"));
}

Authentication Middleware

server/server.js
export function addMiddlewares(app) {
app.use((req, res, next) => {
const token = req.headers.authorization;
if (token) {
req.user = verifyToken(token);
}
next();
});
}

Middleware Order

Middlewares execute in the order they are added. Place authentication and logging middlewares before route handlers:

server/server.js
export function addMiddlewares(app) {
// 1. Logging (runs first)
app.use(morgan("combined"));

// 2. Static files
app.use("/assets", express.static("./public"));

// 3. Authentication
app.use(authMiddleware);

// 4. Custom headers
app.use(headerMiddleware);
}